#!/bin/bash

# ChromiumOS 全自动构建脚本 - 清华镜像版
# 版本：2.1
# 更新日期：2023-12-01

# 全局配置
WORKSPACE="$HOME/chromiumos"
REPO_URL="https://mirrors.tuna.tsinghua.edu.cn/git/chromiumos/chromiumos/manifest"
REPO_TOOL_URL="https://mirrors.tuna.tsinghua.edu.cn/git/git-repo"
BUILD_SCRIPT="$WORKSPACE/src/build.sh"
TEST_SCRIPT="$WORKSPACE/src/test_vm.sh"
DEFAULT_BOARD="amd64-generic"

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'

# 安装 repo 工具
install_repo_tool() {
    echo -e "${GREEN}[1/8] 配置 repo 工具...${NC}"
    mkdir -p ~/bin
    curl -sSL https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o ~/bin/repo || {
        echo -e "${RED}无法下载 repo 工具${NC}"
        exit 1
    }
    chmod a+x ~/bin/repo
    export PATH="$HOME/bin:$PATH"
    
    # 持久化配置
    if ! grep -q "export PATH=\"\$HOME/bin:\$PATH\"" ~/.bashrc; then
        echo 'export PATH="$HOME/bin:$PATH"' >> ~/.bashrc
        echo -e "${GREEN}已添加 PATH 到 bashrc${NC}"
    fi
}

# 依赖安装函数
install_dependencies() {
    echo -e "${GREEN}[2/8] 正在检测并安装依赖...${NC}"
    
    # 识别发行版
    if [ -f /etc/os-release ]; then
        . /etc/os-release
        case $ID in
            debian|ubuntu)
                sudo apt-get update && sudo apt-get install -y \
                    git python3 docker.io qemu-kvm curl lsb-release \
                    make gcc g++ pkg-config libssl-dev libglib2.0-dev \
                    libpixman-1-dev libnss3-tools
                ;;
            fedora)
                sudo dnf install -y \
                    git python3 docker qemu-kvm curl redhat-lsb \
                    make gcc gcc-c++ pkgconfig openssl-devel glib2-devel \
                    pixman-devel nss-tools
                ;;
            arch|manjaro)
                sudo pacman -Syu --noconfirm \
                    git python3 docker qemu curl lsb-release \
                    make gcc pkgconf openssl glib2 pixman nss
                ;;
            *)
                echo -e "${RED}不支持的Linux发行版${NC}"
                exit 1
                ;;
        esac
        
        # 启动Docker服务
        sudo systemctl enable --now docker
        sudo usermod -aG docker $USER
    else
        echo -e "${RED}无法识别Linux发行版${NC}"
        exit 1
    fi
}

# 配置镜像加速
configure_mirror() {
    echo -e "${GREEN}[3/8] 配置镜像加速...${NC}"
    git config --global url."https://mirrors.tuna.tsinghua.edu.cn/git/chromiumos/".insteadOf https://chromium.googlesource.com/
    git config --global url."https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/".insteadOf https://android.googlesource.com/
    
    # 配置Docker镜像加速
    sudo mkdir -p /etc/docker
    echo '{"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]}' | sudo tee /etc/docker/daemon.json
    sudo systemctl restart docker
}

# 初始化仓库
init_repo() {
    echo -e "${GREEN}[4/8] 初始化仓库...${NC}"
    mkdir -p "$WORKSPACE"
    cd "$WORKSPACE" || exit 1

    echo -e "${YELLOW}注意：本镜像仅支持 master 分支，其他版本可能同步失败${NC}"
    
    if [ ! -d .repo ]; then
        repo init -u "$REPO_URL" \
            --repo-url "$REPO_TOOL_URL" \
            --no-clone-bundle || {
                echo -e "${RED}仓库初始化失败${NC}"
                exit 1
            }

        # 修改远程仓库配置
        local remotes_file=".repo/manifests/_remotes.xml"
        if [ -f "$remotes_file" ]; then
            sed -i \
                -e 's#https://chromium.googlesource.com#https://mirrors.tuna.tsinghua.edu.cn/git/chromiumos#g' \
                -e 's#https://android.googlesource.com#https://mirrors.tuna.tsinghua.edu.cn/git/AOSP#g' \
                "$remotes_file"
            echo -e "${GREEN}已替换远程仓库地址${NC}"
        else
            echo -e "${RED}未找到_remotes.xml文件，请手动配置${NC}"
            exit 1
        fi
    fi
}

# 同步源码
sync_source() {
    echo -e "${GREEN}[5/8] 同步源码...${NC}"
    local retries=3
    local count=0
    
    while [ $count -lt $retries ]; do
        repo sync -j$(nproc) \
            --fail-fast \
            --no-tags \
            --no-clone-bundle \
            --optimized-fetch && break
        
        ((count++))
        echo -e "${YELLOW}同步失败，正在重试 (第 $count 次)...${NC}"
        sleep 5
    done

    if [ $count -eq $retries ]; then
        echo -e "${RED}同步失败，请检查网络连接${NC}"
        exit 1
    fi
}

# 生成编译脚本
generate_build_script() {
    echo -e "${GREEN}[6/8] 生成编译脚本...${NC}"
    cat > "$BUILD_SCRIPT" <<'EOF'
#!/bin/bash
set -e

source chromite/bin/cros_sdk
setup_board --board=amd64-generic
build_packages
build_image --board=amd64-generic
EOF

    chmod +x "$BUILD_SCRIPT"
}

# 生成测试脚本
generate_test_script() {
    echo -e "${GREEN}[7/8] 生成测试脚本...${NC}"
    local image_path="$WORKSPACE/src/build/images/$DEFAULT_BOARD/latest/chromiumos_image.bin"
    
    cat > "$TEST_SCRIPT" <<EOF
#!/bin/bash
qemu-system-x86_64 \\
    -m 4096 \\
    -smp 4 \\
    -drive file="$image_path",format=raw \\
    -net nic \\
    -net user,hostfwd=tcp::2222-:22 \\
    -vga virtio \\
    -display gtk \\
    -enable-kvm
EOF

    chmod +x "$TEST_SCRIPT"
}

# 编译系统
build_system() {
    echo -e "${GREEN}[8/8] 开始编译...${NC}"
    cd "$WORKSPACE/src" || exit 1
    
    # 初始化编译环境
    cros_sdk --enter -- || {
        echo -e "${YELLOW}首次编译需要较长时间，请耐心等待...${NC}"
        ./build.sh
    }
}

# 后期处理
post_build() {
    echo -e "${GREEN}编译完成！后续操作建议：${NC}"
    echo -e "1. 测试虚拟机: ${TEST_SCRIPT}"
    echo -e "2. 镜像位置: $WORKSPACE/src/build/images/"
    echo -e "3. 自定义配置参考: https://mirrors.tuna.tsinghua.edu.cn/help/chromiumos/"
}

# 主流程
main() {
    clear
    echo -e "${GREEN}=== ChromiumOS 全自动构建工具 ==="
    echo -e "版本: 2.1 | 数据源: 清华镜像"
    echo -e "===================================${NC}"
    
    install_repo_tool
    install_dependencies
    configure_mirror
    init_repo
    sync_source
    generate_build_script
    generate_test_script
    build_system
    post_build
}

# 执行入口
if [[ $EUID -eq 0 ]]; then
    echo -e "${RED}错误：请不要使用root权限运行本脚本${NC}"
    exit 1
fi

main
    
    read -p "请输入版本号 [默认: 1.0.0]: " version
    version=${version:-1.0.0}
    
    read -p "请输入制造商名称 [默认: Custom Inc.]: " manufacturer
    manufacturer=${manufacturer:-Custom Inc.}

    cat > $lsb_file <<EOF
CHROMEOS_RELEASE_NAME="$product_name"
CHROMEOS_RELEASE_VERSION=$version
CHROMEOS_RELEASE_TRACK=stable
CHROMEOS_RELEASE_MANUFACTURER="$manufacturer"
EOF
}

# 启用子系统
enable_subsystems() {
    local make_conf="$WORKSPACE/src/overlays/overlay-chromiumos/make.conf"
    
    read -p "启用Android子系统支持 (ARC++)？[y/N]: " arc_choice
    if [[ $arc_choice =~ [Yy] ]]; then
        echo 'USE="${USE} arc"' >> $make_conf
        echo 'USE="${USE} android-container-pi"' >> $make_conf
    fi
    
    read -p "启用Linux子系统支持 (Crostini)？[y/N]: " crostini_choice
    if [[ $crostini_choice =~ [Yy] ]]; then
        echo 'USE="${USE} crostini"' >> $make_conf
        echo 'USE="${USE} virtio-gpu"' >> $make_conf
    fi
}

# 自动编译
auto_build() {
    echo -e "${GREEN}启动自动编译...${NC}"
    cd $WORKSPACE/src || exit 1
    ./build.sh || {
        echo -e "${RED}编译失败，请检查日志${NC}"
        exit 1
    }
    generate_test_script
}

# 主流程
main() {
    clear
    echo -e "${GREEN}ChromiumOS 全自动定制工具${NC}"
    
    # 安装依赖
    install_dependencies
    
    # 配置环境
    configure_mirror
    
    # 初始化仓库
    init_repo
    sync_source
    
    # 系统定制
    replace_boot_animation
    modify_system_info
    enable_subsystems
    
    # 生成编译脚本
    generate_build_script
    
    # 自动编译
    auto_build
    
    # 测试提示
    echo -e "${GREEN}编译完成！可以通过以下方式测试："
    echo -e "1. 直接运行测试脚本: ${TEST_SCRIPT}"
    echo -e "2. 使用VirtualBox加载镜像文件${NC}"
}

# 执行主流程
main